package com.github.cakin.shiro.chapter21.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @className: UserRunAsDaoImpl
 * @description: UserRunAsDaoImpl 实现类
 * @date: 2020/5/29
 * @author: cakin
 */
@Repository
public class UserRunAsDaoImpl implements UserRunAsDao {

    /**
     * 注入jdbcTemplate
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 功能描述：fromUserId（老板） 授权给 toUserId（秘书）
     *
     * @param fromUserId 授权者
     * @param toUserId   被授权者
     * @author cakin
     * @date 2020/5/29
     */
    public void grantRunAs( Long fromUserId, Long toUserId ) {
        String sql = "insert into sys_user_runas(from_user_id, to_user_id) values (?,?)";
        if (!exists(fromUserId, toUserId)) {
            jdbcTemplate.update(sql, fromUserId, toUserId);
        }
    }

    /**
     * 功能描述：fromUserId（老板） 和 toUserId（秘书） 这条授权记录在表中是否存在
     *
     * @param fromUserId 授权者
     * @param toUserId   被授权者
     * @return boolean boolean
     * @author cakin
     * @date 2020/5/29
     */
    public boolean exists( Long fromUserId, Long toUserId ) {
        String sql = "select count(1) from sys_user_runas where from_user_id=? and to_user_id=?";
        return jdbcTemplate.queryForObject(sql, Integer.class, fromUserId, toUserId) != 0;
    }

    /**
     * 功能描述：fromUserId（老板） 取消授权给 toUserId（秘书）
     *
     * @param fromUserId 授权者
     * @param toUserId   被授权者
     * @author cakin
     * @date 2020/5/29
     */
    public void revokeRunAs( Long fromUserId, Long toUserId ) {
        String sql = "delete from sys_user_runas where from_user_id=? and to_user_id=?";
        jdbcTemplate.update(sql, fromUserId, toUserId);
    }

    /**
     * 功能描述：查看 哪些授权者（老板列表） 给 被授权者（秘书）授权
     *
     * @param toUserId 被授权者（秘书）
     * @return List<Long> 授权者列表（老板）
     * @author cakin
     * @date 2020/5/29
     */
    public List<Long> findFromUserIds( Long toUserId ) {
        String sql = "select from_user_id from sys_user_runas where to_user_id=?";
        return jdbcTemplate.queryForList(sql, Long.class, toUserId);
    }

    /**
     * 功能描述：查看 授权者（老板） 给 哪些被授权者（秘书列表）授权
     *
     * @param fromUserId 授权者（老板）
     * @return List<Long> 被授权者列表（秘书）
     * @author cakin
     * @date 2020/5/29
     */
    public List<Long> findToUserIds( Long fromUserId ) {
        String sql = "select to_user_id from sys_user_runas where from_user_id=?";
        return jdbcTemplate.queryForList(sql, Long.class, fromUserId);
    }
}
